//
//  Problem1324.swift
//  TestProject
//
//  Created by 毕武侠 on 2021/4/6.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 1324. 竖直打印单词
 给你一个字符串 s。请你按照单词在 s 中的出现顺序将它们全部竖直返回。
 单词应该以字符串列表的形式返回，必要时用空格补位，但输出尾部的空格需要删除（不允许尾随空格）。
 每个单词只能放在一列上，每一列中也只能有一个单词。

 示例 1：
     输入：s = "HOW ARE YOU"
     输出：["HAY","ORO","WEU"]
     解释：每个单词都应该竖直打印。
      "HAY"
      "ORO"
      "WEU"
 示例 2：
     输入：s = "TO BE OR NOT TO BE"
     输出：["TBONTB", "OEROOE", "   T"]
     解释：题目允许使用空格补位，但不允许输出末尾出现空格。
     "TBONTB"
     "OEROOE"
     "   T"
 示例 3：
     输入：s = "CONTEST IS COMING"
     输出：["CIC", "OSO", "N M", "T I", "E N", "S G", "T"]

 提示：

 1 <= s.length <= 200
 s 仅含大写英文字母。
 题目数据保证两个单词之间只有一个空格。
 */
@objcMembers class Problem1324: NSObject {
    func solution() {
        print(printVertically("TO BE OR NOT TO BE"))
        print(printVertically("CONTEST IS COMING"))
    }
    
    /*
     1: 遍历字符串，创建一个list存储竖直单词，那么创建一个n计算单词的每个字符的位置，遇到" "重新计数
     2: 第一个单词的所有字符：是每个单词的首字母，创建一个只包含该字符的字符串，放入数组中
     3: 对于其他单词，首先计算这个单词是第几个单词，用z计数，然后遍历单词，
     4: 如果字符c的下标n比z小：TO NOT：第二个单词的T下标是2，但是z=1，说明前面的单词长度比我的小1个，那么就添加z-n个" "字符
     */
    func printVertically(_ s: String) -> [String] {
        var n = 0           // 计算字符在单词的位置
        var list: Array<String> =  []
        var z = 0           // 计算一边遍历了几个单词
        for c in s {
            if c == " " {
                n = 0
                z += 1
            } else {
                n += 1
                if n > list.count {
                    list.append("")
                }
                
                if z > list[n-1].count {
                    for _ in 0..<z-list[n-1].count {
                        list[n-1].append(" ")
                    }
                }
                list[n-1].append(c)
            }
            
        }
        
        return list
    }
}
